﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using WCF;
using System.Web.Security;

namespace geekmeet
{
    /// <summary>
    /// This class handles the matching between users
    /// </summary>
    public class Nerdometric
    {
        //Fields that store the info about a matching between users
        GeekMeetService wcf = new GeekMeetService();
        private int matchpoints;
        private string matchstring;
        private Guid matchingUserID;
        private string matchingUserName;

        public int MatchPoints
        {
            get
            {
                return matchpoints;
            }
            set
            {
                matchpoints = value;
            }
        }

        public string MatchString
        {
            get
            {
                return matchstring;
            }
            set
            {
                matchstring = value;
            }
        }
        public Guid MatchingUserID
        {
            get
            {
                return matchingUserID;
            }
            set
            {
                matchingUserID = value;
            }
        }
        public string MatchingUserName
        {
            get
            {
                return matchingUserName;
            }
            set
            {
                matchingUserName = value;
            }
        }
        public Nerdometric()
        {

        }

        /// <summary>
        /// Calculates how much two users have in common 
        /// </summary>
        /// <param name="user1"></param>
        /// <param name="user2"></param>
        /// <returns>Nerdometric object with info about the users, and how much they had in common
        /// and a generated string that comments the number of points</returns>
        public Nerdometric calculateLove(System.Guid user1, System.Guid user2)
        {
            Nerdometric match = new Nerdometric();
            match.MatchingUserID = user2;
            match.MatchingUserName = wcf.GetUserName(user2);
            match.MatchPoints = getInterestPoints(user1, user2);
            match.MatchString = generateMatchString(match.MatchPoints);
            return match;
        }
        
        /// <summary>
        /// Generates a string based on the matchpoints
        /// </summary>
        /// <param name="matchpoints"></param>
        /// <returns>string with comment on how well 2 users match eachother</returns>
        public string generateMatchString(int matchpoints)
        {
            string matchstring;
            switch (matchpoints)
            {
                case 0:
                    matchstring = "Noll poäng! Tyvärr, ni har faktiskt inte ett dugg gemensamt. Ni kommer inte ha något att prata om och förhållandet kommer inte vara längre än en vecka. Leta vidare!";
                    break;
                case 1:
                    matchstring = "En ynka poäng! Det här ser tyvärr väldigt, väldigt, väldigt mörkt ut.";
                    break;
                case 2:
                    matchstring = "Två poäng! Det här är en mycket tveksam matchning, men det finns en chans att ni inte gör varandra totalt olyckliga ändå.";
                    break;
                case 3:
                    matchstring = "Tre poäng! Det betyder att ni kommer ha något att prata om på första dejten, känna fjärilar på andra dejten och göra slut på den tredje.";
                    break;
                case 4:
                    matchstring = "Fyra poäng! Det här är i gråzonen. Det finns absolut möjlighet till något bra här, men kanske är ni alltför olika ändå?";
                    break;
                case 5:
                    matchstring = "Fem poäng! Det är alltså fifty-fifty, så varför inte? Gör ett försök!";
                    break;
                case 6:
                    matchstring = "Sex poäng! Sex. Hihihihi.";
                    break;
                case 7:
                    matchstring = "Sju poäng! Vår prognos är: klart solsken med liten risk för nederbörd.";
                    break;
                case 8:
                    matchstring = "Åtta poäng! Det här verkar vara ett säkert kort! Mycket gemensamt, stabilt och inga större hinder ivägen.";
                    break;
                case 9:
                    matchstring = "Nio poäng! Vi har ingen garanti för livslång kärlek, men hade vi det skulle vi troligtvis ge den här matchningen det.";
                    break;
                case 10:
                    matchstring = "Tio poäng! Jesus Allan, det här är den perfekta matchningen! Det kan inte bli bättre, ta kontakt på en gång!";
                    break;
                default:
                    matchstring = "En matchning gjord i himlen, för bra för att vara sann.";
                    break;
            }
            return matchstring;
        }

        /// <summary>
        /// Checks how many interests two users have in common and adds a point for each interest
        /// </summary>
        /// <param name="user1"></param>
        /// <param name="user2"></param>
        /// <returns>Number of matchingpoints</returns>
        private int getInterestPoints(System.Guid user1, System.Guid user2)
        {
            int interestpoints = 0; 
            GeekMeetService wcf = new GeekMeetService();
            //Lists with interests from both users
            List<InterestComposite> user1Interests = wcf.GetUserInterests(user1);
            List<InterestComposite> user2Interests = wcf.GetUserInterests(user2);

            //Compares the lists
            foreach (InterestComposite i in user1Interests)
            {
                foreach (InterestComposite j in user2Interests)
                {
                    if (i.InterestID == j.InterestID)
                    {
                        interestpoints++;
                    }
                }
            }
            return interestpoints;
        }
    }
}